//引入ajax请求
import axios from 'axios';

//引用jsonp模块
import jsonp from 'jsonp';

/**
 *
 *  qq音乐接口地址和请求参数：
 *
 *  data结尾的是请求的参数，const声明的为固定的请求参数，let声明的需要再添加参数例如歌单id，榜单id等
 *
 *  req_API 里面的是对应的接口地址，含有qq.com的地址可以用jsonp请求，其他则需要跨域插件处理
 *
 *  jsonp可以使用jsonp插件实现请求，用法类似axios
 *
 * */

//首页请求参数
const getRecommend_data = {
	format: "jsonp",
	loginUin: 0,
	hostUin: 0,
	g_tk: 1928093487,
	inCharset: 'utf-8',
	outCharset: 'utf-8',
	notice: 0,
	platform: "yqq",
	needNewCode: 0,
}
//歌单请求参数 需要disstid
let songList_data = {
	disstid: 2646688496,
	g_tk: 1928093487,
	inCharset: 'utf-8',
	outCharset: 'utf-8',
	notice: 0,
	format: 'jsonp',
	type: 1,
	json: 1,
	utf8: 1,
	onlysong: 0,
	platform: 'yqq',
	hostUin: 0,
	needNewCode: 0
}
//热门列表参数
const discList_data = {
	platform: 'yqq',
	hostUin: 0,
	sin: 0,
	ein: 29,
	sortId: 5,
	needNewCode: 0,
	categoryId: 10000000,
	rnd: Math.random(),
	format: 'json',
	inCharset: "utf-8",
	outCharset: "utf-8",
}
//歌手列表参数
const singer_data = {
	g_tk: 1928093487,
	inCharset: "utf-8",
	outCharset: "utf-8",
	notice: 0,
	format: "jsonp",
	channel: "singer",
	page: "list",
	key: "all_all_all",
	pagesize: 100,
	pagenum: 1,
	hostUin: 0,
	needNewCode: 0,
	platform: "yqq",
}
//歌手歌曲列表参数
const singerTrack_data = {
	g_tk: 1928093487,
	inCharset: "utf-8",
	outCharset: "utf-8",
	notice: 0,
	format: "jsonp",
	hostUin: 0,
	needNewCode: 0,
	platform: "yqq",
	order: "listen",
	begin: 0,
	num: 80,
	songstatus: 1,
}
//排行榜
const topList_data = {
	inCharset: "utf-8",
	outCharset: "utf-8",
	notice: 0,
	format: "jsonp",
	uin: 0,
	needNewCode: 1,
	platform: "h5",
}
//排行榜榜单
let topList_cp_data = {
	g_tk: 1928093487,
	inCharset: "utf-8",
	outCharset: "utf-8",
	notice: 0,
	format: "jsonp",
	needNewCode: 1,
	uin: 0,
	tpl: 3,
	page: "detail",
	type: "top",
	platform: "h5",
	//topid: "",
}

//请求地址
const req_API = {
	//首页
	recommend: "https://c.y.qq.com/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg",
	//歌单
	songList: "http://ustbhuangyi.com/music/api/getCdInfo",
	//热门歌单
	discList: "http://ustbhuangyi.com/music/api/getDiscList",
	//歌手列表
	singerList: "https://c.y.qq.com/v8/fcg-bin/v8.fcg",
	//歌手歌曲列表
	singerTrackList: "https://c.y.qq.com/v8/fcg-bin/fcg_v8_singer_track_cp.fcg",
	//排行榜
	topList: "https://c.y.qq.com/v8/fcg-bin/fcg_myqq_toplist.fcg",
	//榜单
	toplist_cp: "https://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg",
}

//请求热门榜
function getRecommend() {
	//承诺。把Promise承诺对象返回到调用的外部
	return new Promise((resolve, reject) => {
		//jsonp(URL,opts,fun) → 链接地址，参数，回调函数
		//URL地址需要拼接
		jsonp(param(req_API.recommend, songList_data), {
			param: "jsonpCallback",
			prefix: "jp",
		}, function(err, res) {
			//第一个参数err是错误信息，第二个参数res是成功信息。
			//返回成功的结果
			return resolve(res);
		});
	});
}

//请求排行榜
function getTopList() {
	return new Promise((resolve, reject) => {
		jsonp(param(req_API.topList, topList_data), {
			param: "jsonpCallback",
			prefix: "jp",
		}, function(err, res) {
			return resolve(res);
		});
	});
}

//请求排行榜歌单
function getTopSongs(topid) {
	topList_cp_data.topid = topid
	return new Promise((resolve, reject) => {
		jsonp(param(req_API.toplist_cp, topList_cp_data), {
			param: "jsonpCallback",
			prefix: "jp",
		}, function(err, res) {
			return resolve(res);
		});
	});
}

//请求歌手列表
function getSingerList() {
	return new Promise((resolve, reject) => {
		jsonp(param(req_API.singerList, singer_data), {
			param: "jsonpCallback",
			prefix: "jp"
		}, function(arr, res) {
			return resolve(res);
		})
	});
}

//请求歌手歌单列表
function getSingerSongs(id) {
	singerTrack_data.singerid = id;
	return new Promise((resolve, reject) => {
		axios.get(param(req_API.singerTrackList, singerTrack_data)).then((res) => {
			return resolve(res.data);
		})
	})
}

//请求热门歌单
function getSongList(id) {
	//给请求参数添加字段并且赋值
	songList_data.disstid = id; //?
	/**
	 * 3.传过了的id值赋给songList_data参数里的disstid，并覆盖它；
	 * 4.通过Promise()函数去执行请求，并返回最终的请求值；
	 * 5.通过ajax请求；
	 * 6.由于请求地址需要拼接，所以把原地址和请求参数放到param()函数里，进行拼接；
	 * 7.拼接完毕完毕后才是最终的请求地址；
	 * 8.紧跟then()函数来返回请求结果；
	 * 9.把请求结果返回到getSongList()函数，同时页返回到页面渲染。
	 */

	return new Promise((resolve, reject) => {
		axios.get(param(req_API.songList, songList_data)).then((res) => {
			return resolve(res.data);
		});
	});
}

//test
function getConst(){
	return singerTrack_data;
}

//定义
const api = {
	getRecommend: getRecommend,
	getSongList: getSongList,
	getTopList: getTopList,
	getSingerList: getSingerList,
	getSingerSongs: getSingerSongs,
	getTopSongs,
}

//抛出
export default api;

/**
 * 给url拼接参数
 * url     地址
 * data    参数，以json键值对形式
 */
function param(url, data) {
	url += (url.indexOf('?') < 0 ? '?' : '&');
	var p = "";
	for(var k in data) {
		let value = data[k] !== undefined ? data[k] : ''
		p += '&' + k + '=' + encodeURIComponent(value)
	}
	p ? p.substring(1) : ''
	return url + p;
}